package com.kakaxi.mybilibili.view;

import android.content.Context;
import android.graphics.Rect;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.kakaxi.mybilibili.utils.DensityUtil;

import java.util.List;

/**
 * 格子布局的边距设置器
 * Created by kakaxi on 16/9/4.
 */

public class GridMarginDecoration extends RecyclerView.ItemDecoration {

    /** 设置外边距的类型列表 **/
    private List<Integer> mTypeList;

    /** 设置外边距的类型 **/
    private int mSingleType;

    /** 上外边距数值 **/
    private int mMarginTop;
    /** 下外边距数值 **/
    private int mMarginBottom;
    /** 左外边距数值 **/
    private int mMarginLeft;
    /** 右外边距数值 **/
    private int mMarginRight;

    /** 自动调整中间的间距 **/
    private boolean autoFixMiddle = true;

    /** 默认边距 **/
    public final static int DEFAULT_MARGIN_DP = 12;

    /**
     * 以默认为10边距初始化方法
     *
     * @param context 上下文
     */
    public GridMarginDecoration(Context context) {
        this(context, null);
    }

    /**
     * 带自定义边距的初始化方法
     *
     * @param context  上下文
     * @param marginDp dp边距数值,当数值为null时默认边距为10
     */
    public GridMarginDecoration(Context context, Integer marginDp) {
        int margin;
        if (marginDp == null) { // 默认边距数值
            margin = DensityUtil.dipToPx(context, DEFAULT_MARGIN_DP);
        } else { // 自定义边距
            margin = DensityUtil.dipToPx(context, marginDp);
        }
        setMargin(margin);
    }

    /**
     * 带指定设置边距类型的初始化方法
     *
     * @param context    上下文
     * @param singleType 指定设置边距类型
     * @param marginDp   dp边距数值,当数值为null时默认边距为10
     */
    public GridMarginDecoration(Context context, Integer marginDp, int singleType) {
        this(context, marginDp);
        mSingleType = singleType;
    }

    /**
     * 带指定设置边距类型列表的初始化方法
     *
     * @param context  上下文
     * @param typeList 指定设置边距类型列表
     * @param marginDp dp边距数值,当数值为null时默认边距为10
     */
    public GridMarginDecoration(Context context, List<Integer> typeList, Integer marginDp) {
        this(context, marginDp);
        mTypeList = typeList;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
            state) {
        int currentPos = parent.getChildLayoutPosition(view);
        // 判断有没有指定类型进行边距设置
        if (mTypeList == null && mSingleType <= 0) { // 无类型指定
            makeMargin(outRect, parent, currentPos);
        } else {
            // 获取当前所要设置边距的项的位置然后获取项的类型
            Integer type = parent.getAdapter().getItemViewType(currentPos);
            // 通过类型列表或者独立类型进行边距设置
            if (mTypeList != null) { // 类型列表
                if (mTypeList.contains(type)) { // 包含此类型设置边距
                    makeMargin(outRect, parent, currentPos);
                }
            } else { // 特定类型
                if (mSingleType == type) { // 与特定类型相符设置边距
                    makeMargin(outRect, parent, currentPos);
                }
            }
        }
    }

    /**
     * 设置边距,自动调整中间边距与不自定两种方式
     *
     * @param outRect    当前项的边框
     * @param parent     列表控件
     * @param currentPos 当前项的位置
     */
    private void makeMargin(Rect outRect, RecyclerView parent, int currentPos) {
        // 判断是否自动调整中间的间距
        if (isAutoFixMiddle()) { // 自动调整中间
            // 获取格子布局管理器,获取列设置器,获取总列数
            GridLayoutManager gridLayoutManager = (GridLayoutManager) parent.getLayoutManager();
            GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
            int spanCount = gridLayoutManager.getSpanCount();
            // 判断当前位置是否为首列
            if (spanSizeLookup.getSpanIndex(currentPos, spanCount) == 0) { // 首列,设置左右下边距
                outRect.set(mMarginLeft, 0, mMarginRight, mMarginBottom);
            } else { // 不是首列,设置右下间距
                outRect.set(0, 0, mMarginRight, mMarginBottom);
            }
        } else { // 不调整中间边距,直接设置周围的边距
            outRect.set(mMarginLeft, mMarginTop, mMarginRight, mMarginBottom);
        }
    }

    public boolean isAutoFixMiddle() {
        return autoFixMiddle;
    }

    public void setAutoFixMiddle(boolean autoFixMiddle) {
        this.autoFixMiddle = autoFixMiddle;
    }

    public void setMargin(int margin) {
        setMargin(margin, margin, margin, margin);
    }

    public void setMargin(int marginLeft, int marginTop, int marginRight, int marginBottom) {
        mMarginTop = marginTop;
        mMarginBottom = marginBottom;
        mMarginLeft = marginLeft;
        mMarginRight = marginRight;
    }

    public int getMarginTop() {
        return mMarginTop;
    }

    public int getMarginBottom() {
        return mMarginBottom;
    }

    public int getMarginLeft() {
        return mMarginLeft;
    }

    public int getMarginRight() {
        return mMarginRight;
    }

    public int getSingleType() {
        return mSingleType;
    }

    public void setSingleType(int singleType) {
        this.mSingleType = singleType;
    }

    public void setTypeList(List<Integer> typeList) {
        this.mTypeList = typeList;
    }

    public List<Integer> getTypeList() {
        return mTypeList;
    }

}
